<?php

	$Files = array();
	$fileTypes = array(
		'-', // Regular file
		'd', // Directory
		'с', // Файлы символьного режима
		'b', // Файлы блочного режима
		'l', // Символические ссылки
		'p', // Именованые каналы
		's', // Сокеты
	
	/**
	 *  c  Файлы символьного режима: 
	 *  эти файлы являются либо специальными системными файлами 
	 *  (типа /dev/null, который мы уже рассматривали), 
	 *  либо периферийными устройствами (последовательные или параллельные 
	 *  порты), характерной особенностью которых является то, что их 
	 *  содержимое (если оно есть) не буферизуется (т.е. оно не хранится 
	 *  в памяти). Такие файлы идентифицируются буквой c.
	 *  
	 *  b  Файлы блочного режима: 
	 *  эти файлы являются периферийными устройствами,
	 *  и, в отличие от символьных файлов, их содержимое буферизуется. 
	 *  Например, файлами этой категории являются жесткие диски, разделы на 
	 *  жестком диске, дисководы, CD-ROM и так далее. Примеры файлов блочного 
	 *  доступа: /dev/hda, /dev/sda5. В информации, выводимой командой ls -l, 
	 *  они идентифицируются буквой b.
	 *  
	 *  l  Символические ссылки: 
	 *  эти файлы являются очень распространенными и 
	 *  часто используется в процедуре запуска системы Mandrakelinux (см. 
	 *  главу Глава 11, Загрузочные файлы: init sysv). Как следует из их 
	 *  имени, их цель - связывать файлы символическим способом, что означает, 
	 *  что они являются файлами, содержащими путь к другому файлу. Они могут 
	 *  и не указывать на существующий файл. Очень часто их называют «мягкими 
	 *  ссылками», и идентифицируются они буквой «l».
	 *  
	 *  p  Именованные каналы: 
	 *  если вы были удивлены, то так оно и есть, да, они 
	 *  очень похожи на каналы, используемые в командах shell'а, но с той 
	 *  разницей, что у этих каналов и в самом деле есть имена. Однако они 
	 *  очень редки и маловероятно, что вы встретите их во время своего 
	 *  путешествия по дереву файлов. На всякий случай, чтобы вы знали, 
	 *  они идентифицируются буквой p. Чтобы узнать больше об этом, загляните 
	 *  в «Анонимные каналы и именованные каналы».
	 *  
	 *  s  Сокеты: 
	 *  это тип файла для всех сетевых подключений, но только 
	 *  некоторые из них имеют названия. А самое главное, что существует 
	 *  несколько типов сокетов, а связь может быть установлена только 
	 *  через один из этих типов, но это уже выходит за рамки данной книги. 
	 *  Такие файлы идентифицируются буквой s.
	 */
	
	);
	
	$orderFields = array('name', 'type', 'size', 'created', 'updated', 'opened');
	
	function asc_file_sort_name($a, $b)
	{
		if ($a['name'] == $b['name']) {
	        return 0;
	    }
	    return ($a['name'] < $b['name']) ? -1 : 1;
	}
	
	function desc_file_sort_name($a, $b)
	{
		if ($a['name'] == $b['name']) {
	        return 0;
	    }
	    return ($a['name'] > $b['name']) ? -1 : 1;
	}
	
	function asc_file_sort_size($a, $b)
	{
		if ($a['size'] == $b['size']) {
	        return 0;
	    }
	    return ($a['size'] < $b['size']) ? -1 : 1;
	}
	
	function desc_file_sort_size($a, $b)
	{
		if ($a['size'] == $b['size']) {
	        return 0;
	    }
	    return ($a['size'] > $b['size']) ? -1 : 1;
	}
	
	switch (Request::getURLParam('action')) 
    {
    	
    	case 'list':
    		print_r(scandir(Session::getParam('pwd')));
    		break;
    		
    	case 'cd':
			$new_pwd = Request::getURLParam('param');
			if (! file_exists($new_pwd) || ! is_dir($new_pwd)) {
				throw new Exception('Directory not exists!');
			}
			
			Session::setParam('pwd', $new_pwd);
    		$list = scandir(Session::getParam('pwd'));
    		array_shift($list);
    		array_shift($list);
    		
    		$Folders = array();
    		
    		foreach ($list as $name) {
    			$fullName = Session::getParam('pwd').'/'.$name;

    			$info = array(
    				//fifo, char, dir, block, link, file, socket and unknown
    				'type' => filetype($fullName),
    				'name' => $name,
    				'path' => Session::getParam('pwd'),
    				//'atime' => fileatime($fullName),
    				//'ctime' => filectime($fullName),
    				//'group' => filegroup($fullName),
    				//'mtime' => filemtime($fullName),
    				//'owner' => fileowner($fullName),
    				//'perms' => fileperms($fullName),
    				//'size'  => filesize($fullName),
    			);
    			if ($info['type'] == 'dir') {
    				$Directories[] = $info; 
    			} else {
    				$Files[] = $info;
    			}
    		}
	        $order = in_array(Request::getURLParam('order'), $orderFields) ? Request::getURLParam('order') : 'name';
	    	$direct = in_array(Request::getURLParam('direct'), array('asc', 'desc')) ? Request::getURLParam('direct') : 'asc';
    	
    		if ($direct == 'asc') {
    			usort($Directories, 'asc_file_sort_'.$order);
    			usort($Files, 'asc_file_sort_'.$order);
    		} else {
    			usort($Directories, 'desc_file_sort_'.$order);
    			usort($Files, 'desc_file_sort_'.$order);
        	}
        	$Files = array_values($Directories) + array_values($Files);
			break;
    		
    	case 'get':
    		break;
    		
    	case 'put':
    		break;
    		
    	case 'delete':
    		break;
    }

?>